package lin

import (
	"errors"
	"os/exec"
	"syscall"
)

type C程序 struct {
	cmd    *exec.Cmd
	附加运行条件 []string
}

func (类 *C程序) F附加运行条件(附加条件 ...string) {
	类.附加运行条件 = 附加条件
}
func (类 *C程序) runProgram(程序全路径 string, hideWindow bool, 是否等待程序结束 ...bool) error {
    if !全_文件.P判断文件_是否存在(程序全路径) {
        return errors.New("错误:程序不存在")
    }
    if 类.cmd != nil {
        if err := 类.cmd.Process.Kill(); err != nil {
            return err
        }
    }
    if len(类.附加运行条件) > 0 {
        类.cmd = exec.Command(程序全路径, 类.附加运行条件...)
    } else {
        类.cmd = exec.Command(程序全路径)
    }

    if hideWindow {
        类.cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
    }
    if len(是否等待程序结束) > 0 && 是否等待程序结束[0] {
        return 类.cmd.Run()
    }
    return 类.cmd.Start()
}


func (类 *C程序) Y运行程序_隐藏运行(程序全路径 string, 是否等待程序结束 ...bool) (返回_结果 error) {
	return 类.runProgram(程序全路径, true, 是否等待程序结束...)
}

func (类 *C程序) Y运行程序(程序全路径 string, 是否等待程序结束 ...bool) (返回_结果 error) {
	return 类.runProgram(程序全路径, false, 是否等待程序结束...)
}

func (类 *C程序) D等待程序关闭() (返回_结果 error) {
	if 类.cmd == nil {
		返回_结果 = errors.New("错误:程序未在运行")
		return
	}
	_, 返回_结果 = 类.cmd.Process.Wait()
	return
}

func (类 *C程序) G关闭程序() (返回_结果 error) {
	if 类.cmd == nil {
		返回_结果 = errors.New("错误:程序未在运行")
		return
	}
	返回_结果 = 类.cmd.Process.Kill()
	return
}
func (类 *C程序) Q取进程id() (进程id int, 返回_结果 error) {
	if 类.cmd == nil {
		返回_结果 = errors.New("错误:程序未在运行")
		return
	}
	return 类.cmd.Process.Pid, nil
}

func (类 *C程序) Q取运行程序路径() (程序路径 string, 返回_结果 error) {
	if 类.cmd == nil {
		返回_结果 = errors.New("错误:程序未在运行")
		return
	}

	return 类.cmd.Path, nil
}
